/**********************************************************************/
/*                                                                    */
/*      MODE.C                                                        */
/*                                                                    */
/*      Copyright (c) 1995 - 2000  Microsoft Corporation                */
/*                                                                    */
/**********************************************************************/
#include "stdafx.h"
#include <windows.h>
#include <imm.h>
#include "resource.h"
#include "imeapps.h"


LRESULT HandleModeCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
	HIMC hIMC = ImmGetContext(hWndCompStr);
	DWORD dwConv, dwSent;
	DWORD dwTemp;

	ImmGetConversionStatus(hIMC,&dwConv,&dwSent);

	switch(LOWORD(wParam))
	{
	case IDM_NATIVEMODE:
		dwTemp = dwConv & ~IME_CMODE_LANGUAGE;

		switch (dwConv & IME_CMODE_LANGUAGE)
		{
		case IME_CMODE_ALPHANUMERIC:
			dwTemp |= IME_CMODE_NATIVE;
			break;

		case IME_CMODE_NATIVE:
			dwTemp |= (IME_CMODE_NATIVE | IME_CMODE_KATAKANA);
			break;

		case (IME_CMODE_NATIVE | IME_CMODE_KATAKANA): /* fall-through */
		default:
			break;
		}
		dwConv = dwTemp;
		break;

	case IDM_FULLHALF:
		if (dwConv & IME_CMODE_FULLSHAPE)
		{
			dwConv &= ~IME_CMODE_FULLSHAPE;
		}
		else
		{
			dwConv |= IME_CMODE_FULLSHAPE;
		}
		break;

	case IDM_ROMAN:
		if (dwConv & IME_CMODE_ROMAN)
		{
			dwConv &= ~IME_CMODE_ROMAN;
		}
		else
		{
			dwConv |= IME_CMODE_ROMAN;
		}
		break;

	case IDM_CHARCODE:
		if (dwConv & IME_CMODE_CHARCODE)
		{
			dwConv &= ~IME_CMODE_CHARCODE;
		}
		else
		{
			dwConv |= IME_CMODE_CHARCODE;
		}
		break;

	case IDM_HANJA:
		if (dwConv & IME_CMODE_HANJACONVERT)
		{
			dwConv &= ~IME_CMODE_HANJACONVERT;
		}
		else
		{
			dwConv |= IME_CMODE_HANJACONVERT;
		}
		break;

	case IDM_SOFTKBD:
		if (dwConv & IME_CMODE_SOFTKBD)
		{
			dwConv &= ~IME_CMODE_SOFTKBD;
		}
		else
		{
			dwConv |= IME_CMODE_SOFTKBD;
		}
		break;

	case IDM_EUDC:
		if (dwConv & IME_CMODE_EUDC)
		{
			dwConv &= ~IME_CMODE_EUDC;
		}
		else
		{
			dwConv |= IME_CMODE_EUDC;
		}
		break;

	case IDM_SYMBOL:
		if (dwConv & IME_CMODE_SYMBOL)
		{
			dwConv &= ~IME_CMODE_SYMBOL;
		}
		else
		{
			dwConv |= IME_CMODE_SYMBOL;
		}
		break;
	}

	ImmSetConversionStatus(hIMC,dwConv,dwSent);
	ImmReleaseContext(hWndCompStr,hIMC);

	return 1L;
}

LRESULT HandleConvertCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
	HIMC hIMC = ImmGetContext(hWndCompStr);
	DWORD dwSel;
	DWORD dwSize;
	LPCANDIDATELIST lpCL = NULL;

	switch(wParam)
	{
	case IDM_CONVERT:
		ImmNotifyIME(hIMC,NI_COMPOSITIONSTR,CPS_CONVERT,0);
		break;

	case IDM_CANCEL:
		ImmNotifyIME(hIMC,NI_COMPOSITIONSTR,CPS_CANCEL,0);
		break;

	case IDM_REVERT:
		ImmNotifyIME(hIMC,NI_COMPOSITIONSTR,CPS_REVERT,0);
		break;

	case IDM_COMPLETE:
		ImmNotifyIME(hIMC,NI_COMPOSITIONSTR,CPS_COMPLETE,0);
		break;

	case IDM_OPENCAND:
		ImmNotifyIME(hIMC,NI_OPENCANDIDATE,0,0);
		break;

	case IDM_CLOSECAND:
		ImmNotifyIME(hIMC,NI_CLOSECANDIDATE,0,0);
		break;

	case IDM_NEXTCAND: /* fall-through */
	case IDM_PREVCAND:
		if (dwSize = ImmGetCandidateList(hIMC,0x0,NULL,0))
		{
			lpCL = (LPCANDIDATELIST)GlobalAlloc(GPTR,dwSize);

			ImmGetCandidateList(hIMC,0x0,lpCL,dwSize);

			dwSel = lpCL->dwSelection;

			if (wParam == IDM_NEXTCAND)
			{
				if (++dwSel >= lpCL->dwCount)
				{
					dwSel = 0;
				}
			}
			else
			{
				if (dwSel)
				{
					dwSel--;
				}
				else
				{
					dwSel = lpCL->dwCount - 1;
				}
			}
			GlobalFree((HANDLE)lpCL);

			ImmNotifyIME(hIMC,NI_SELECTCANDIDATESTR,0,dwSel);
		}
		break;

	}

	ImmReleaseContext(hWndCompStr,hIMC);

	return 1;
}

